解决 Timeshift 快照无法删除的问题:子卷“目录不为空”

这篇文章记录了我在使用 Timeshift + Btrfs 文件系统做系统备份时,遇到快照无法删除的问题,以及最终的解决方案。如果你也遇到类似情况,希望这篇文章对你有所帮助。


一、问题背景

在 Linux 下,我一直使用 Timeshift 进行系统快照备份,配合 Btrfs 文件系统,备份速度快,回滚也很方便。

某天我想删除一个旧快照,于是用了官方推荐的命令:

sudo timeshift --delete --snapshot 2025-05-22_22-00-51

结果却报错了:

E: ERROR: Could not destroy subvolume/snapshot: Directory not empty
E: Failed to delete snapshot subvolume: ...

尝试用底层命令 btrfs subvolume delete 删除,也一样提示“目录不为空”而失败。


二、问题原因分析

Btrfs 的快照,其实就是一个“只读子卷(subvolume)”。Btrfs 为了保护文件系统的完整性,不允许直接强删一个非空的子卷。也就是说:

所以,我们需要按 Btrfs 的方式一步步清理干净,然后再手动删除子卷。


三、解决方案(实测有效)

步骤 1:挂载 Btrfs 根分区

首先找到你的根分区设备名(我的是 /dev/nvme0n1p2),然后挂载:

sudo mkdir -p /mnt/btrfs-root
sudo mount /dev/nvme0n1p2 /mnt/btrfs-root

步骤 2:清空快照目录下的内容

sudo rm -rf /mnt/btrfs-root/timeshift-btrfs/snapshots/2025-05-22_22-00-51/@/*
sudo rm -rf /mnt/btrfs-root/timeshift-btrfs/snapshots/2025-05-22_22-00-51/@/.* 2>/dev/null

上面的 .* 是为了删除隐藏文件(比如 .bashrc.config 等)


步骤 3:删除子卷本体

sudo btrfs subvolume delete /mnt/btrfs-root/timeshift-btrfs/snapshots/2025-05-22_22-00-51/@

如果顺利,会提示类似:

Delete subvolume 256 (no-commit): ...

步骤 4:删除整个快照目录

sudo rm -rf /mnt/btrfs-root/timeshift-btrfs/snapshots/2025-05-22_22-00-51

步骤 5:卸载挂载点(可选)

sudo umount /mnt/btrfs-root
sudo rmdir /mnt/btrfs-root

四、常见问题提示


五、总结

这个问题其实不是 Timeshift 的 Bug,而是 Btrfs 的“安全机制”:子卷删除前必须彻底清空。

只要掌握了 Btrfs 子卷的处理方式,手动清理也不算太难。对于经常折腾系统的朋友来说,了解这些底层机制反而是一次不错的学习机会。


参考命令速查:

# 查看子卷列表
sudo btrfs subvolume list /mnt/btrfs-root

# 删除子卷
sudo btrfs subvolume delete /mnt/路径/子卷名

# 检查当前挂载
mount | grep timeshift

如果你也曾被这个问题困扰,欢迎留言交流 😄